&= ^= |= <<= >>= 怎么算?有例题

来源:百度知道 编辑:UC知道 时间:2024/05/03 08:18:38
&= ^= |= <<= >>= 怎么运算啊?
例如
#include<stdio.h>
main()
{ int a=10,b=21,c,n=3;
a&=b;
b|=a;
printf("a=a&b=%d,b=b|a=%d\n",a,b);
a>>=n+1;
b<<=n+1;
printf("a=a>>n+1=%d,b=b<<n+1=%d\n",a,b);
a=~a;
b^=a;
printf("a=~a=%d,b=b^a=%d",a,b);
}
在TurboC 2.0下的运行结果为:
a=a&b=0,b=b|a=21
a=a>>=n+1=0,b=b<<n+1=336
a=~a=-1,b=^a=-337

怎么算的啊?具体点
a=~a=-1,b=^a=-337
说说这怎么算就可以了
其余两个都会了,谢谢啊!

跟+=是一样的,也就是说a &= b就等价于a = a & b,其他以此类同。

为什么楼主说例题不对呢?结果就是应该这样的啊。提醒楼主一下a&=b会改变a的值,这样后面的b|=a就是基于a的新值来计算的了。如果你需要使用其旧值的话应该用另外的变量来保存。

a=~a表示对a取反,当时a为0,所以取反之后为0xffffffff即为-1. -1在电脑里面是它的补码表示。

b^=a表示b=b^a即b和a异或(按位加,不进位),当时a为0xffffffff,与b异或也相当于对b取反,336(0x150)的反码就是-337(0xfffffeb0)了(记得-337在电脑里面是337的补码)。

其实要方便理解位的运算,建议你将变量定义成无符号数,再用十六进制或二进制输出,远比十进制直观。

这些都是位的复合运算符,a&=b就是a=a&b就是把它们的二进制位进行与操作,相应的二制位都是1结果为1,否则结果是0,b|=a就是b=b|a进行或操作,如果相应二进制位都是0结果为0,否则结果是1,a>>=n+1就是a=a>>(n+1),就是把a的二进制位右移n+1位,同样b<<=n+1就是把b的二进制位左移n+1位,a=~a是把a的二进制位取反,如果是0就变成1,如果是1就变成0,b^=a就是b=b^a,把它们相应的二进制数进行异或操作,只有当相应的二进制数不同时,结果才为1